package com.basic.business.common.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

import static com.alibaba.druid.util.FnvHash.Constants.DATE_FORMAT;

/**
 * 时间工具类
 *
 * @author zhaoxy_jn@163.com
 */
public class DateUtils {

    private static final String TIMESTAMP_FORMAT = "yyyy-MM-dd HH:mm:ss";

    private static final String DATE_FORMAT = "yyyy年MM月/dd日";

    /**
     * 获取当前时间戳初始化为0秒的时间戳
     */
    public static Long getZeroTimestamp(Long timestamp){
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(timestamp);
        calendar.add(Calendar.MINUTE, 0);
        // 重置为0秒
        calendar.set(Calendar.SECOND, 0);
        // 重置为0的毫秒
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTimeInMillis();
    }

    /**
     * 时间戳转年月日时分秒
     */
    public static String timestampToDate(Long timestamp){
        return new SimpleDateFormat(TIMESTAMP_FORMAT).format(new Date(timestamp));
    }

    /**
     * 获取当前时间戳一分钟的时间范围
     */
    public static String[] getOneMinuteTimeRange(Long timestamp) {
        // 将时间戳转换为Calendar对象
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(timestamp);
        // 重置为0秒
        calendar.set(Calendar.SECOND, 0);
        // 重置为0的毫秒
        calendar.set(Calendar.MILLISECOND, 0);
        // 转换为年月日时分秒
        String startTime = format(calendar.getTime());
        // 当前时间戳加五十九秒为后一分钟时间结束时间
        calendar.add(Calendar.SECOND, 59);
        String endTime = format(calendar.getTime());
        return new String[]{startTime, endTime};
    }

    /**
     * 格式化时间
     * @param time 时间
     */
    private static String format(Date time) {
        return new SimpleDateFormat(TIMESTAMP_FORMAT).format(time);
    }

    /**
     * 判断传入时间是否在当前时间之前
     */
    public static boolean isBeforeNow(String timestamp) {
        return Long.parseLong(timestamp) < System.currentTimeMillis();
    }

    /**
     * 日期字符串转时间戳（毫秒级）
     */
    public static String dateToTimestamp(String date) {
        try {
            return String.valueOf(new SimpleDateFormat(TIMESTAMP_FORMAT).parse(date).getTime());
        } catch (ParseException e) {
            throw new RuntimeException("【DateUtil工具类：日期字符串转时间戳】失败，错误信息--->" + e);
        }
    }

    /**
     * 根据当前时间戳计算后一分钟的时间范围
     */
    public static String[] getAfterOneMinuteRange(String timestamp) {
        // 将时间戳转换为Calendar对象
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(Long.parseLong(timestamp));
        // 重置为0秒
        calendar.set(Calendar.SECOND, 0);
        // 重置为0的毫秒
        calendar.set(Calendar.MILLISECOND, 0);
        // 当前时间戳加一分钟为后一分钟时间开始时间
        calendar.add(Calendar.MINUTE, 1);
        // 转换为年月日时分秒
        String startTime = format(calendar.getTime());
        // 当前时间戳加五十九秒为后一分钟时间结束时间
        calendar.add(Calendar.SECOND, 59);
        String endTime = format(calendar.getTime());
        return new String[]{startTime, endTime};
    }

    /**
     * 日期路径 年/月/日 若2025/01/01
     * 若是23:00-00:00 则是第二天
     */
    public static String getDatePath() {
        LocalTime nowTime = LocalTime.now();
        LocalDate nowDate = LocalDate.now();

        // 判断当前时间是否在23:00之前
        if (nowTime.isAfter(LocalTime.of(23, 0)) || nowTime.equals(LocalTime.of(23, 0))) {
            // 返回第二天的日期
            nowDate = nowDate.plusDays(1);
        }
        return nowDate.format(DateTimeFormatter.ofPattern(DATE_FORMAT));
    }
}
